/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package generic

import (
	"time"

	"google.golang.org/protobuf/proto"
)

func AllSubscriptions[S Subscription, T interface{ GetSubscriptions() []S }](t T) []Subscription {
	var subs []Subscription
	for _, s := range t.GetSubscriptions() {
		subs = append(subs, s)
	}
	return subs
}

func GetSubscription[S Subscription, T interface{ GetSubscriptions() []S }](t T, id string) Subscription {
	for _, s := range t.GetSubscriptions() {
		if s.GetId() == id {
			return s
		}
	}
	return nil
}

type Insight interface {
	proto.Message
	IsOnline() bool
	GetSubscription(id string) Subscription
	AllSubscriptions() []Subscription
	UpdateSubscription(Subscription) error
}

type Subscription interface {
	proto.Message
	GetId() string
	GetGeneration() uint32
	IsOnline() bool
	SetDisconnectTime(time time.Time)
}
